package com.hm.manage.utils;

import com.jcraft.jsch.*;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

import java.util.Vector;

@Slf4j
@Component
public class SFTPFileService {

    public static void main(String[] args) {
        String host = "172.18.16.170";  // SFTP 服务器地址
        int port = 55555;                     // SFTP 端口，默认 22
        String user = "hik";          // 用户名
        String password = "wujin320@2019";      // 密码
        String dirPath = "/home/hik"; // 目标目录
        int timeout = 30000;               // 超时时间（毫秒）

        JSch jsch = new JSch();
        Session session = null;
        ChannelSftp sftpChannel = null;

        try {
            // 1. 创建 SSH 会话
            session = jsch.getSession(user, host, port);
            session.setPassword(password);

            // 2. 配置主机密钥检查（生产环境需严格验证）
            session.setConfig("StrictHostKeyChecking", "no");

            // 3. 设置超时时间
            session.setTimeout(timeout);
            session.connect();  // 连接会话（受 timeout 控制）

            // 4. 打开 SFTP 通道
            Channel channel = session.openChannel("sftp");
            channel.connect();
            sftpChannel = (ChannelSftp) channel;

            // 5. 切换目录
            sftpChannel.cd(dirPath);

            // 6. 列出目录内容
            Vector<ChannelSftp.LsEntry> entries = sftpChannel.ls(".");
            int fileCount = 0;

            // 7. 统计文件数量（排除目录和符号链接）
            for (ChannelSftp.LsEntry entry : entries) {
                if (!entry.getAttrs().isDir()) {
                    fileCount++;
                }
            }

            System.out.println("目录 '" + dirPath + "' 中的文件数量为: " + fileCount);

        } catch (JSchException e) {
            if (e.getMessage().contains("timeout")) {
                System.err.println("连接超时: " + e.getMessage());
            } else {
                System.err.println("SFTP 连接失败: " + e.getMessage());
            }
        } catch (SftpException e) {
            System.err.println("SFTP 操作失败: " + e.getMessage());
        } finally {
            // 关闭连接
            if (sftpChannel != null) {
                sftpChannel.exit();
            }
            if (session != null) {
                session.disconnect();
            }
        }
    }

    public Integer getFileCount(String server, int port, String user, String password, String dirPath)
    {
        int fileCount = 0;
        int timeout = 30000;               // 超时时间（毫秒）
        JSch jsch = new JSch();
        Session session = null;
        ChannelSftp sftpChannel = null;

        try {
            // 1. 创建 SSH 会话
            session = jsch.getSession(user, server, port);
            session.setPassword(password);

            // 2. 配置主机密钥检查（生产环境需严格验证）
            session.setConfig("StrictHostKeyChecking", "no");

            // 3. 设置超时时间
            session.setTimeout(timeout);
            session.connect();  // 连接会话（受 timeout 控制）

            // 4. 打开 SFTP 通道
            Channel channel = session.openChannel("sftp");
            channel.connect();
            sftpChannel = (ChannelSftp) channel;

            // 5. 切换目录
            sftpChannel.cd(dirPath);

            // 6. 列出目录内容
            Vector<ChannelSftp.LsEntry> entries = sftpChannel.ls(".");


            // 7. 统计文件数量（排除目录和符号链接）
            for (ChannelSftp.LsEntry entry : entries) {
                if (!entry.getAttrs().isDir()) {
                    fileCount++;
                }
            }

            System.out.println(server+"目录 '" + dirPath + "' 中的文件数量为: " + fileCount);
            return fileCount;

        } catch (JSchException e) {
            if (e.getMessage().contains("timeout")) {
                System.err.println("连接超时: " + e.getMessage());
            } else {
                System.err.println("SFTP 连接失败: " + e.getMessage());
            }
        } catch (SftpException e) {
            System.err.println("SFTP 操作失败: " + e.getMessage());
        } finally {
            // 关闭连接
            if (sftpChannel != null) {
                sftpChannel.exit();
            }
            if (session != null) {
                session.disconnect();
            }
        }
        return 0;
    }
}
